package com.fosdata.dpm.util;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

public class CaptchaUtil {
    // 验证码图片宽度
    private static final int WIDTH = 120;
    // 验证码图片高度
    private static final int HEIGHT = 40;
    // 验证码字符数量
    private static final int CODE_COUNT = 4;
    // 干扰线数量
    private static final int LINE_COUNT = 5;
    // 字符字体大小
    private static final int FONT_SIZE = 20;

    // 验证码字符集（排除易混淆的字符：0、o、O、1、l、I等）
    private static final String CODE_CHAR = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789";

    private static Random random = new Random();

    /**
     * 生成验证码图片
     * @param outputStream 输出流（如Servlet的response.getOutputStream()）
     * @return 生成的验证码字符串
     */
    public static String generateCaptcha(OutputStream outputStream) {
        // 创建图片缓冲区
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        // 获取画笔
        Graphics g = image.getGraphics();

        // 1. 设置背景色（浅灰色）
        g.setColor(getRandomColor(200, 250));
        g.fillRect(0, 0, WIDTH, HEIGHT);

        // 2. 设置字体
        g.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, FONT_SIZE));

        // 3. 绘制干扰线
        for (int i = 0; i < LINE_COUNT; i++) {
            // 随机线条颜色
            g.setColor(getRandomColor(150, 200));
            // 随机起点和终点
            int x1 = random.nextInt(WIDTH);
            int y1 = random.nextInt(HEIGHT);
            int x2 = random.nextInt(WIDTH);
            int y2 = random.nextInt(HEIGHT);
            g.drawLine(x1, y1, x2, y2);
        }

        // 4. 绘制噪点（随机像素）
        for (int i = 0; i < 50; i++) {
            g.setColor(getRandomColor(100, 200));
            int x = random.nextInt(WIDTH);
            int y = random.nextInt(HEIGHT);
            g.fillOval(x, y, 2, 2); // 绘制1x1的小圆点
        }

        // 5. 生成随机字符并绘制
        StringBuilder codeBuilder = new StringBuilder();
        for (int i = 0; i < CODE_COUNT; i++) {
            // 随机获取字符
            char c = CODE_CHAR.charAt(random.nextInt(CODE_CHAR.length()));
            codeBuilder.append(c);
            // 随机字符颜色
            g.setColor(getRandomColor(50, 150));
            // 随机位置绘制（避免字符重叠）
            int x = i * (WIDTH / CODE_COUNT) + 5;
            int y = HEIGHT / 2 + random.nextInt(10) - 5; // 上下微调
            g.drawString(String.valueOf(c), x, y);
        }

        // 释放资源
        g.dispose();

        // 6. 输出图片到流
        try {
            ImageIO.write(image, "JPEG", outputStream);
        } catch (IOException e) {
            throw new RuntimeException("验证码生成失败", e);
        }

        // 返回生成的验证码字符串
        return codeBuilder.toString();
    }

    /**
     * 生成随机颜色
     * @param min 颜色最小值（0-255）
     * @param max 颜色最大值（0-255）
     */
    private static Color getRandomColor(int min, int max) {
        if (min > 255) min = 255;
        if (max > 255) max = 255;
        int r = min + random.nextInt(max - min);
        int g = min + random.nextInt(max - min);
        int b = min + random.nextInt(max - min);
        return new Color(r, g, b);
    }

    // 测试方法：生成验证码图片到本地文件
    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("captcha.jpg")) {
            String code = generateCaptcha(fos);
            System.out.println("生成的验证码：" + code);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
